﻿using System;
using System.Windows;
using System.Windows.Input;
using personalplaner.business;
using personalplaner.business.enums;
using personalplaner.common.mvvm;
using personalplaner.common.mvvm.commands;
using personalplaner.gui.plugins.dienstplan.windows;
using personalplaner.gui.settings.views;
using personalplaner.gui.stamm.views;
using personalplaner.gui.stamm.windows;
using personalplaner.servicemodel.dataaccess;
using personalplaner.services;

namespace personalplaner.viewmodels
{
    public class MainMenuViewModel : BaseViewModel
    {
        public MainMenuViewModel(DependencyObject parent)
            : base(parent)
        {
        }
        
        #region Commands

        #region Main Menu

        #region Properties

        ICommand _closeCommand;
        public ICommand CloseCommand
        {
            get
            {
                if (_closeCommand == null)
                    _closeCommand = new RelayCommand(OnClose);
                return _closeCommand;
            }
        }

		ICommand _settingsCommand;
		public ICommand SettingsCommand
        {
            get
            {
				if (_settingsCommand == null)
					_settingsCommand = new RelayCommand(OnSettings);
				return _settingsCommand;
            }
        }

        #endregion

        #region Methods

        private void OnClose(object parameter)
        {
            var wnd = Window.GetWindow(Parent);
            if (wnd == null)
                throw new Exception();

            wnd.Close();
        }

        private void OnSettings(object parameter)
        {
            var mw = GetService<IMainWindowDisplayContainer>();
            mw.IsWaitVisible = true;

			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.Settings))
				service.SelectItem(enDisplayItemType.Settings);
			else
				service.AddSimpleContentItem(enDisplayItemType.Settings, new SettingsView());
        }

        #endregion

        #endregion

        #region Bearbeiten

        #region Properties

		//ICommand _dienstplanCommand;
		//public ICommand DienstPlanCommand
		//{
		//    get
		//    {
		//        if (_dienstplanCommand == null)
		//            _dienstplanCommand = new RelayCommand(OnDienstPlan);
		//        return _dienstplanCommand;
		//    }
		//}

		//ICommand _personOverviewCommand;
		//public ICommand PersonOverviewCommand
		//{
		//    get
		//    {
		//        if (_personOverviewCommand == null)
		//            _personOverviewCommand = new RelayCommand(OnPersonOverview);
		//        return _personOverviewCommand;
		//    }
		//}

        ICommand _createNewPlanCommand;
        public ICommand CreateNewPlanCommand
        {
            get
            {
                if (_createNewPlanCommand == null)
                    _createNewPlanCommand = new RelayCommand(OnCreateNewPlan);
                return _createNewPlanCommand;
            }
        }

        #endregion

        #region Methods
        
        private void OnCreateNewPlan(object parameter)
        {

			var da = GetService<ICommonDataAccess>();
			if (da.GetSchemaCount() == 0)
			{
				MessageBox.Show(Window.GetWindow(Parent),
					"Es ist kein aktives Schema vorhanden.\nBitte erstellen Sie ein neues Schema oder reaktivieren sie ein bestehendes?",
					"Kein Schema vorhanden",
					MessageBoxButton.OK,
					MessageBoxImage.Asterisk);

				var service = GetService<IMainWindowDisplayContainer>();

				if (service.ContainesItem(enDisplayItemType.PlanLayoutStamm))
					service.SelectItem(enDisplayItemType.PlanLayoutStamm);
				else
					service.AddSimpleContentItem(enDisplayItemType.PlanLayoutStamm, new PlanLayoutStamm());

				return;
			}

        	var wnd = new CreateNewPlanView()
            {
                Owner = Window.GetWindow(Parent),
            };

            wnd.ShowDialog();
        }

    	#endregion

        #endregion

        #region Ansicht

        #region Properties

        #endregion

        #region Methods

        #endregion

        #endregion

        #region Stammdaten

        #region Properties

        ICommand _personalStammCommand;
        public ICommand PersonalStammCommand
        {
            get
            {
                if (_personalStammCommand == null)
                    _personalStammCommand = new RelayCommand(OnPersonalStamm);
                return _personalStammCommand;
            }
        }

        ICommand _personHinzufügenCommand;
        public ICommand PersonHinzufügenCommand
        {
            get
            {
                if (_personHinzufügenCommand == null)
                    _personHinzufügenCommand = new RelayCommand(OnPersonHinzufügen);
                return _personHinzufügenCommand;
            }
        }

		ICommand _holidayStammCommand;
		public ICommand HolidayStammCommand
		{
			get
			{
				if (_holidayStammCommand == null)
					_holidayStammCommand = new RelayCommand(OnHolidayStamm);
				return _holidayStammCommand;
			}
		}

		ICommand _diensteStammCommand;
		public ICommand DiensteStammCommand
		{
			get
			{
				if (_diensteStammCommand == null)
					_diensteStammCommand = new RelayCommand(OnDiensteStamm);
				return _diensteStammCommand;
			}
		}

		ICommand _dienstSerieCommand;
		public ICommand DienstSerieCommand
		{
			get
			{
				if (_dienstSerieCommand == null)
					_dienstSerieCommand = new RelayCommand(OnDienstSerie, param => false);
				return _dienstSerieCommand;
			}
		}

        ICommand _abteilungsStammCommand;
        public ICommand AbteilungsStammCommand
        {
            get
            {
                if (_abteilungsStammCommand == null)
                    _abteilungsStammCommand = new RelayCommand(OnAbteilungsStamm);
                return _abteilungsStammCommand;
            }
        }

        ICommand _anstellungsStammCommand;
        public ICommand AnstellungsStammCommand
        {
            get
            {
                if (_anstellungsStammCommand == null)
                    _anstellungsStammCommand = new RelayCommand(OnAnstellungsStamm);
                return _anstellungsStammCommand;
            }
        }

		ICommand _planLayoutStammCommand;
		public ICommand PlanLayoutStammCommand
		{
			get
			{
				if (_planLayoutStammCommand == null)
					_planLayoutStammCommand = new RelayCommand(OnPlanLayoutStamm);
				return _planLayoutStammCommand;
			}
		}
        

        #endregion

        #region Methods

        private void OnPersonalStamm(object parameter)
        {
			var service = GetService<IMainWindowDisplayContainer>();
			service.IsWaitVisible = true;

			if (service.ContainesItem(enDisplayItemType.PersonalStamm))
				service.SelectItem(enDisplayItemType.PersonalStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.PersonalStamm, new PersonalStamm());

			//var dlg = new PersonalStamm();
			//dlg.Owner = Window.GetWindow(Parent);
			//dlg.ShowDialog();
        }

        private void OnPersonHinzufügen(object parameter)
        {
            var dlg = new AddPersonWizard();
            dlg.Owner = Window.GetWindow(Parent);
            dlg.ShowDialog();
        }

		private void OnHolidayStamm(object pram)
		{
			var service = GetService<IMainWindowDisplayContainer>();
			service.IsWaitVisible = true;

			if (service.ContainesItem(enDisplayItemType.HolidayStamm))
				service.SelectItem(enDisplayItemType.HolidayStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.HolidayStamm, new HolidayStamm());
		}

    	#region Dienste

		private void OnDiensteStamm(object parameter)
		{
			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.DiensteStamm))
				service.SelectItem(enDisplayItemType.DiensteStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.DiensteStamm, new DienstStamm());
		}

		private void OnDienstSerie(object parameter)
		{
		}

    	#endregion

		private void OnAbteilungsStamm(object parameter)
        {
			//var dlg = new AbteilungStamm();
			//dlg.Owner = Window.GetWindow(Parent);
			//dlg.ShowDialog();

			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.AbteilungStamm))
				service.SelectItem(enDisplayItemType.AbteilungStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.AbteilungStamm, new AbteilungStamm());
        }

        private void OnAnstellungsStamm(object parameter)
        {
			//var dlg = new AnstellungsStamm();
			//dlg.Owner = Window.GetWindow(Parent);
			//dlg.ShowDialog();

			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.AnstellungsStamm))
				service.SelectItem(enDisplayItemType.AnstellungsStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.AnstellungsStamm, new AnstellungsStamm());
        }

		private void OnPlanLayoutStamm(object parameter)
		{
			//var dlg = new PlanLayoutStamm();
			//dlg.Owner = Window.GetWindow(Parent);
			//dlg.ShowDialog();

			var service = GetService<IMainWindowDisplayContainer>();

            //if (service.ContainesItem(enDisplayItemType.PlanLayoutStamm))
            //    service.SelectItem(enDisplayItemType.PlanLayoutStamm);
            //else
            service.AddSimpleContentItem(enDisplayItemType.PlanLayoutStamm, new PlanLayoutStamm(), true);
		}

    	#endregion

        #endregion

        #region Extras

        #region Properties

		ICommand _planStammCommand;
    	public ICommand PlanStammCommand
    	{
    		get
    		{
    			if (_planStammCommand == null)
    				_planStammCommand = new RelayCommand(OnPlanStamm);
    			return _planStammCommand;
    		}
    	}

		ICommand _editMonthsCommand;
		public ICommand EditMonthsCommand
		{
			get
			{
				if (_editMonthsCommand == null)
					_editMonthsCommand = new RelayCommand(OnEditMonths);
				return _editMonthsCommand;
			}
		}

		ICommand _feiertageStammCommand;
		public ICommand FeiertageStammCommand
		{
			get
			{
				if (_feiertageStammCommand == null)
					_feiertageStammCommand = new RelayCommand(OnFeiertageStamm);
				return _feiertageStammCommand;
			}
		}

		ICommand _planungsjahrStammCommand;
		public ICommand PlanungsjahrStammCommand
		{
			get
			{
				if (_planungsjahrStammCommand == null)
					_planungsjahrStammCommand = new RelayCommand(OnPlanungsjahrStamm);
				return _planungsjahrStammCommand;
			}
		}

    	#endregion

        #region Methods

		private void OnPlanStamm(object param)
		{
			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.PlanStamm))
				service.SelectItem(enDisplayItemType.PlanStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.PlanStamm, new PlanStamm());
		}

		private void OnEditMonths(object param)
		{
			var dlg = new EditDaysInMonth()
			{
				Owner = Window.GetWindow(Parent)
			};

			dlg.ShowDialog();
		}

		private void OnFeiertageStamm(object param)
		{
			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.FeiertageStamm))
				service.SelectItem(enDisplayItemType.FeiertageStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.FeiertageStamm, new FeiertageStamm());
		}

		private void OnPlanungsjahrStamm(object param)
		{
			var service = GetService<IMainWindowDisplayContainer>();

			if (service.ContainesItem(enDisplayItemType.PlanungsJahrStamm))
				service.SelectItem(enDisplayItemType.PlanungsJahrStamm);
			else
				service.AddSimpleContentItem(enDisplayItemType.PlanungsJahrStamm, new PlanungsJahrStamm());
		}

    	#endregion

        #endregion

        #region Style

        ICommand _styleCommand;
        public ICommand StyleCommand
        {
            get
            {
                if (_styleCommand == null)
                    _styleCommand = new RelayCommand<string>(OnExecuteStyle);
                return _styleCommand;
            }
        }

        private void OnExecuteStyle(string param)
        {
            if (string.IsNullOrEmpty(param))
                return;

            var service = GetService<IApplicationStyleService, ApplicationStyleService>();
            service.SelectStyle(param);

            var options = new OptionsDataAccess(personalplaner.common.SettingsProvider.Settings);
            options.Style = param;
        }


        #endregion

        #endregion

        //private void testPersonalstammToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    var dlg = new personalplaner.gui.stamm.views.PersonalStamm();
        //    //dlg.Owner = this;
        //    dlg.ShowDialog();
        //}

        //private void abteilungsstammNeuToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    var dlg = new personalplaner.gui.stamm.views.AbteilungStamm();
        //    //dlg.Owner = this;
        //    dlg.ShowDialog();
        //}

        //private void personHinzufügenNeuToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    var dlg = new personalplaner.gui.stamm.views.AddPersonWizard();
        //    //dlg.Owner = this;
        //    dlg.ShowDialog();
        //}
    }
}
